﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int StudentID { get; set; }       
        [StringLength(50, MinimumLength = 1)]
        public string LastName { get; set; }

        [StringLength(50,ErrorMessage ="First name cannot be longer than 50 characters.")]
        [Column("FirstName")]
        [Display(Name = "First Name")]
        public string FirstMidName { get; set; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}",ApplyFormatInEditMode =true)]
        [Display(Name = "Enrollment Date")]
        public DateTime EnrollmentDate { get; set; }
        //The DataType attribute is used to specify a data type that is more specific than the 
        //database  intrinsic type.In this case we only want to keep track of the date, not the date 
        //and time.

        [Display(Name = "Full Name")]
        public string FullName
        {
            //FullName 是计算属性，返回其他两个属性计算出的结果。因此它只有 get 访问方法，而且在数据库中没有名为 FullName 的字段。
            get
            {
                return LastName + ", " + FirstMidName;
            }
        }

        public virtual ICollection<Enrollment> Enrollments { get; set; }

        /*
         * StudentID 属性将会映射到数据库中关联到这个类的表的主键，默认情况下，EF 将属性名为 ID 或者 类名ID 的属性作为主键。

Enrollments 属性是导航属性，导航属性用来导航到这个实体关联的其他实体。Student 类的 Enrollments 属性用来持有这个学生关联
的所有注册实体。或者说，如果在数据库中，一个学生行有两个关联的注册行（通过 StudentId 这个外键关联到学生表）,学生实体的
注册属性将会包含包含两个注册实体。

导航属性典型地被定义为虚拟的 virtual，以便通过 EF 名为延迟加载的功能来获得好处，(延迟加载将在后面进行说明)，如果导航属性
可以持有多个实体，(在多对多情况下，或者一对多情况下)，类型必须为 ICollection。
         
         
         */
    }
}